BiasAdd
将偏置向量 input_bias 沿通道维广播,加到输入张量 input_x 上。
\[\mathrm{output} = \mathrm{input\_x} + \mathrm{input\_bias}\]
NCHW:\(\mathrm{output}(n,c,h,w) = \mathrm{input\_x}(n,c,h,w) + \mathrm{input\_bias}(c)\)
NHWC:\(\mathrm{output}(n,h,w,c) = \mathrm{input\_x}(n,h,w,c) + \mathrm{input\_bias}(c)\)
- 输入:
input_x - 输入张量地址
input_bias - 偏置地址,长度等于通道数 C;c64 时为交错复数,长度 2C 个 float
dims - 维度数组;NCHW 为 [N, C, H, W],NHWC 为 [N, H, W, C]
shape_size - 维数(测试常用 4)
data_format - 布局:0 为 NCHW,1 为 NHWC(整型,不是字符串)
length - input_x 元素个数(复数时为复数个数)
core_mask - 核掩码(仅共享存储版本)
- 输出:
output - 输出地址,形状与 input_x 相同
- 支持平台:
FT78NEMT7004
备注
FT78NE 支持 int8、int16、int32、fp32、fp64、cplx64、cplx128
MT7004 支持 int16、int32、fp16、fp32、cplx64
data_format 为 int:0 = NCHW,非 0(测试用 1)= NHWC
共享存储版本:
-
void i8_bias_add_s(int8_t *input_x, int8_t *input_bias, int8_t *output, int *dims, int shape_size, int data_format, int length, int core_mask)
-
void i16_bias_add_s(int16_t *input_x, int16_t *input_bias, int16_t *output, int *dims, int shape_size, int data_format, int length, int core_mask)
-
void i32_bias_add_s(int32_t *input_x, int32_t *input_bias, int32_t *output, int *dims, int shape_size, int data_format, int length, int core_mask)
-
void hp_bias_add_s(float16 *input_x, float16 *input_bias, float16 *output, int *dims, int shape_size, int data_format, int length, int core_mask)
-
void fp_bias_add_s(float *input_x, float *input_bias, float *output, int *dims, int shape_size, int data_format, int length, int core_mask)
-
void dp_bias_add_s(double *input_x, double *input_bias, double *output, int *dims, int shape_size, int data_format, int length, int core_mask)
-
void c64_bias_add_s(float *input_x, float *input_bias, float *output, int *dims, int shape_size, int data_format, int length, int core_mask)
-
void c128_bias_add_s(double *input_x, double *input_bias, double *output, int *dims, int shape_size, int data_format, int length, int core_mask)
C调用示例:
1// MT7004 示例(共享存储多核,DDR 地址,NHWC)
2void TestBiasAddSMCFp32(int core_mask) {
3 int core_id = get_core_id();
4 int logic_core_id = GetLogicCoreId(core_mask, core_id);
5 int core_num = GetCoreNum(core_mask);
6 float *input_x = (float *)0x81000000;
7 float *input_bias = (float *)0x82000000;
8 float *output = (float *)0x83000000;
9 int *dims = (int *)0x85000000;
10 if (logic_core_id == 0) {
11 dims[0] = 1; dims[1] = 4; dims[2] = 4; dims[3] = 16; /* N,H,W,C */
12 }
13 sys_bar(0, core_num);
14 fp_bias_add_s(input_x, input_bias, output, dims, 4, 1 /* NHWC */, 256, core_mask);
15}
16
17void main() {
18 int core_mask = 0b1111;
19 TestBiasAddSMCFp32(core_mask);
20}
私有存储版本:
-
void i8_bias_add_p(int8_t *input_x, int8_t *input_bias, int8_t *output, int *dims, int shape_size, int data_format, int length)
-
void i16_bias_add_p(int16_t *input_x, int16_t *input_bias, int16_t *output, int *dims, int shape_size, int data_format, int length)
-
void i32_bias_add_p(int32_t *input_x, int32_t *input_bias, int32_t *output, int *dims, int shape_size, int data_format, int length)
-
void hp_bias_add_p(float16 *input_x, float16 *input_bias, float16 *output, int *dims, int shape_size, int data_format, int length)
-
void fp_bias_add_p(float *input_x, float *input_bias, float *output, int *dims, int shape_size, int data_format, int length)
-
void dp_bias_add_p(double *input_x, double *input_bias, double *output, int *dims, int shape_size, int data_format, int length)
-
void c64_bias_add_p(float *input_x, float *input_bias, float *output, int *dims, int shape_size, int data_format, int length)
-
void c128_bias_add_p(double *input_x, double *input_bias, double *output, int *dims, int shape_size, int data_format, int length)
C调用示例:
1// MT7004 示例(私有存储单核,AM 地址,NHWC)
2void TestBiasAddAMFp32(void) {
3 float *input_x = (float *)0x10010000;
4 float *input_bias = (float *)0x10020000;
5 float *output = (float *)0x10030000;
6 int *dims = (int *)0x10050000;
7 dims[0] = 1; dims[1] = 4; dims[2] = 4; dims[3] = 16; /* N,H,W,C */
8 fp_bias_add_p(input_x, input_bias, output, dims, 4, 1 /* NHWC */, 256);
9}
10
11void main() {
12 TestBiasAddAMFp32();
13}